package com.shujia.scala

object Demo14Fun1 {
  def main(args: Array[String]): Unit = {
    /**
      * 面向对象编程，将对象传来传去
      * 1、将对象作为参数
      * 2、将对象作为返回值
      *
      * 需要明确对象的类型
      *
      *
      * 面向函数编程，  将函数传来传去
      * 1、可以将一个函数作为参数
      * 2、可以将一个函数作为返回值
      *
      *
      * 所以徐娅明确每一个函数的类型
      *
      */


    /**
      * scala中函数的定义
      * 1、可以在object创建,  通过对象名直接调用
      * 2、可以类中创建，  需要创建类的对象才能调用
      * 3、可以在任何代码块中创建， 可以直接在后面调用
      *
      * 函数的基本要素
      * 1、函数名
      * 2、函数的参数
      * 3，函数的返回值
      * 4、函数体
      */

    def fun1(): Unit = {
      println("fun1")
    }

    //调用函数
    fun1()
    fun1()

    /**
      * 函数类型的定义
      * 1、函数的类型和函数的参数，函数额返回值有关系
      *
      *
      * def add(i: Int): Int = {
      * i + 1
      * }
      * 函数类型的描述： 这是一个参数为Int类型返回值为Int类型的函数
      *
      * 函数类型的表示方式： Int => Int
      *
      */

    def add(i: Int): Int = {
      i + 1
    }

    val j: Int = add(100)

    println(j)


    //这是一个参数为String 返回值为Int类型的函数
    def fun2(str: String): Int = {
      str.toInt
    }


    //这是一个参数为String没有返回值的函数
    def fun3(str: String): Unit = {
      println(str)
    }

    /**
      *
      * 函数的简写
      * 1、如果函数体只有一行 {} 可以省略
      * 2、如果最后一行作为返回值return可以省略
      * 3、如果没有参数，()  可以省略
      * 4、返回值类型可以省略，会自动推断
      *
      */

    def fun4(str: String): Unit = println(str)


    /**
      * lambda表达式 --- 匿名函数
      *
      * (str: String) => str.toInt
      *
      * => ： 左边是参数
      * => ：右边是函数体
      *
      *
      */

    //这是一个参数为String 返回值为Int类型的函数
    val fun5: String => Int = (str: String) => str.toInt


    val k: Int = fun5("10004")

    println(k)


    def fun6(i: Int): Int = {
      i * 100
    }

    //函数的调用
    val i2: Int = fun6(1000)

    //将函数赋值给一个变量
    val f7: Int => Int = fun6

  }


}
